package com.mybatisplus.demo;

import com.alibaba.druid.util.StringUtils;
import com.mybatisplus.demo.android.enmu.ApiResponse;
import com.mybatisplus.demo.android.enmu.ResultCode;
import com.mybatisplus.demo.android.util.JsonChange;
import com.mybatisplus.demo.android.util.JwtUtil;
import com.mybatisplus.demo.android.util.LoggerUtil;
import com.mybatisplus.demo.android.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * token过滤器 有效期校验
 * 拦截http请求头中的accesstoken 信息 只能查询是否 过期 和身份验证 多点登录需要在impl中校验
 */
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 1. 该方法将在请求处理之前进行调用
     * 2. 返回true会执行下一个Interceptor
     * 3. 返回false则不会执行下一个Interceptor也不会执行Controller里的方法
     * 4. 先声明的Interceptor的preHandle方法会先执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        response.setCharacterEncoding("utf-8");
        //在请求头中获取token
        String token = request.getHeader("accessToken");
        String userId = request.getHeader("userId");
        LoggerUtil.info("token： " + token, TokenInterceptor.class);
        if (null != token) {
            boolean b = JwtUtil.verify(token);
            if (b) {
                String user_id = JwtUtil.getUserId(token);
                LoggerUtil.info("user_id： " + user_id, TokenInterceptor.class);
                LoggerUtil.info("redis缓存： " + redisUtil.get(user_id), TokenInterceptor.class);
                //如果当前token和redis一志则返回true
                if (StringUtils.equals(token, redisUtil.get(user_id)) &&
                        StringUtils.equals(userId, user_id)) {
                    LoggerUtil.info("JWT检验通过", TokenInterceptor.class);
                    return true;
                }
            }
        }
        LoggerUtil.error("redis缓存： " + redisUtil.get(userId), TokenInterceptor.class);
        LoggerUtil.error("user_id： " + userId, TokenInterceptor.class);
        //如果不正确 返回错误信息 拦截
        ApiResponse rt = new ApiResponse();
        rt.setResultCode(ResultCode.AUTH_ERROR);
        response.getWriter().write(JsonChange.objToJson(rt));
        return false;
    }

    /**
     * 1. 该方法将在当前请求进行处理之后调用
     * 2. 且preHandle方法返回为true
     * 3. 先声明的Interceptor的postHandle方法会后执行
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    /**
     * 1. 该方法将在请求完成之后调用
     * 2. 同样且需要preHandle方法返回为true
     * 3. 一般用于进行资源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }


}
